Laravel 5でDBのseeding
データベース:シーディング 5.7 Laravel
Eloquentでモデルをつくっておけば、その属性にデフォルト値を流し込むファクトリを生成できる。まずそちらをつくっておこう
クエリビルダをつかってもできるけど、そもそもEloquentを使う予定なら先に作ってしまうほうが効率的
実際にDBにダミーデータを使ってテストを書いたりするときに便利
注意:Disk I/Oの発生するDBを使ったテストは遅いのでやるべきではない(レガシーコード改善ガイドにも書いてある)
とかいいつつEloquentのテストなどで書いてしまう。実環境がMySQLなのに本番はSQLiteとかあまり意味がないkadoyau.icon
Seedingをする手順
DBのスキーマを見ながらEloquentモデルを作る(作らなくてもいいが、以下はUserのEloquentモデルを作ったことを前提とする)
factoryクラスをつくる
https://readouble.com/laravel/5.7/ja/database-testing.html
php artisan make:factory UserFactory
デフォルトではdatabase/factories以下につくられる
DBのスキーマを見ながらファクトリーを定義する
code:UserFactory.php
$factory->define(App\User::class, function (Faker $faker) {
return [
'name' => $faker->name,
'email' => $faker->unique()->safeEmail,
'email_verified_at' => now(),
'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret
'remember_token' => str_random(10),
];
});
fzaninotto/Fakerが利用できるのでランダムな文字列が楽にかける
未検証
/icons/empty.icon factory stateを使うと一部だけ注入することができる?
一部の属性だけ買えたものをつくりたいときにシンプルにかけそう
Seederクラスをつくる
php artisan make:seeder UsersTableSeeder
Seederクラスのrun()で先に作成したfactoryクラスを使う
code:UserTableSeeder.php
public run() {
factory(App\User::class, 50)->create(); #create()でDBにレコードを生成する
}
未検証
/icons/empty.icon もしレコードにリレーションをもたせたいなら?
autoloaderの更新をする
composer dump-autoload
SeederクラスをつかってDBにダミーデータを入れる
php artisan db:seed --class=UsersTableSeeder
トラブル
作成したEloquentモデルがみつからないと言われて実行が失敗する
原因:composer.jsonのautload.psr-4に適切に名前空間が指定されていない
便利な小技
fzaninotto/Fakerの設定を日本語にする
config/app.phpで設定可能
LaravelのFakerを日本語化する - Qiita
Migrationをやり直しつつseeding
php artisan migrate:refresh --seed
外部キー制約(リレーション)に基づいた注入をする
必要になるシチュエーションの例:PostテーブルのUserのダミーデータは、UserテーブルにいるUserに限定したい
Model Factory: Referencing a foreign keyのコメント欄
Laravelでfactoryを使い初期データを作成する基本的な方法(リレーション有り) - Qiita
Learn to use Model Factories in Laravel - Laravel News
#Laravel_5